class Clock
   attr_reader :vector
   # Constructeur
   #   size : taille du vector clock
   #   init : initialisation de l'horloge. Le tableau
   #          d'initialisation doit avoir la même taille
   #          que le raparètre init
   def initialize(size, init = [])
      raise "Clock.initialize : first parameter must be an Integer" unless size.is_a?(Integer)
      raise "Clock.initialize : second parameter must be an Array" unless init.is_a?(Array)
      raise "Clock.initialize : wrong clock initialization size" unless init.empty? or (not init.empty? and init.length == size)
      
      if not init.empty?
         @vector = init
      else
         @vector = Array.new(size, 0)
      end
   end
   
   # Retourne la valeur de l'horloge à la position donnée
   #    pos : position de l'horloge (commence à 0)
   def at(pos)
      raise "Clock.at : invalid position" unless pos >= 0 and pos < @vector.length
      
      return @vector[pos]
   end
   
   # Incrémentation d'une horloge dans le vecteur
   #    pos : position de l'horloge (commence à 0)
   def inc(pos)
      raise "Clock.inc : invalid position" unless pos >= 0 and pos < @vector.length
      
      @vector[pos] = @vector[pos] + 1
   end
   
   # Sérialisation d'un vector clock
   def to_s
      return @vector.inspect
   end
   
   # Methode statique
   # Desérialisation d'un vector clock
   def Clock.from_s(stringArray)
      tmp = stringArray[1, stringArray.length-2]
      a = tmp.split(", ")
      a.map! {|x| x.to_i }
      return Clock.new(a.length, a)
   end
   
   def eql?(object)
      if object.equal?(self)
         return true
      elsif !self.class.equal?(object.class)
         return false
      end
      
      return object.vector == @vector
   end
   
   def ==(object)
      self.eql?(object)
   end
end 
